//
const express = require('express');
const formidable = require('formidable');
//创建路由器对象
const router = express.Router();
//导入 moment 时间处理库
const moment = require('moment');
//导入管理员模型
const AdminModel = require('../models/AdminModel');
//导入 md5 函数
const md5 = require('md5');
//导入 检查登录的中间件
const checkLogin = require('../middlewares/checkLogin');

//创建路由规则
//显示新增表单的
router.get('/admin/create', checkLogin, (req, res) => {
    //使用 ejs 设置响应体
    res.render('admin/create', {req, title: '新增管理员'});
});

//插入数据库操作
router.post('/admin',checkLogin, (req, res) => {
    //提取表单中的数据 (获取请求体的数据)
    //创建表单对象
    let form = formidable({});
    //解析表单数据
    form.parse(req, (err, fields, files) => {
        if (err) {
            res.status(500);
            res.send('表单解析失败~~')
            return;
        }
        //比对两次密码是否一致
        if(fields.password !== fields.repassword){
            return res.render('notice/error', {msg: '两次密码不一致', time: 2});
        }
        // 判断格式是否正确
        // 判断内容是否合法
        // 查询该用户名是否已经存在
        AdminModel.findOne({username: fields.username}, (err, data) => {
            if(err){
                return res.render('notice/error', {msg: '数据库查询失败~~', time: 2});
            }
            //存在的话 data 为对象, 不存在的话, data 为 null
            if(data){
                return res.render('notice/error', {msg: '该用户名已经存在, 请换一个名字', time: 2});
            }
            //如果用户名不存在
            // 数据库插入
            let d = {
                username: fields.username,
                password: md5(fields.password),
                create_time: moment().format('YYYY-MM-DD HH:mm:ss')   // 2022-05-30 10:10:10   moment
            }
            AdminModel.create(d, (err, data) => {
                if(err) {
                    return res.render('notice/error', {msg: '数据库插入失败~~', time: 2});
                }
                //如果插入成功, 则提示并跳转到管理员列表页面
                res.render('notice/success', {msg: '管理员添加成功', time: 2, url: '/admin'});
            })
        })

        
    })
    
});

//删除数据库操作
router.post('/admin/:id/delete',checkLogin, (req, res) => {
    //获取要删除的管理员 id
    let {id} = req.params;
    //根据 id 删除管理员信息
    AdminModel.deleteOne({_id: id}, (err, data) => {
        if(err){
            return res.render('notice/error', {msg: '删除失败~~', time: 2});
        }
        //成功
        return res.render('notice/success', {msg: '删除成功~~', time: 2, url:'/admin'});
    })
});

//修改
router.get('/admin/:id/edit',checkLogin, (req, res) => {
    //获取请求的 id
    let {id} = req.params;
    //获取当前 id 用户的信息
    AdminModel.findById(id, (err, data) => {
        if(err){
            return res.render('notice/error', {msg: '数据库查询失败~~', time: 2});
        }
        //成功
        //结合模板响应 HTML 内容
        res.render('admin/edit', {data, req, title: '修改管理员信息'});
    });
    
});

//更新
router.post('/admin/:id/update', checkLogin,(req, res) => {
    //更新数据库的内容
    let {id} = req.params;
    //1. 获取表单中的数据
    let form = formidable({});
    //解析表单数据
    form.parse(req, (err, fields, files) => {
        if (err) {
            res.status(500);
            res.send('表单解析失败~~')
            return;
        }
        //2. 检测数据是否合法
        if(fields.password !== fields.repassword){
            return res.render('notice/error', {msg: '两次密码不一致~~', time: 2});
        }
        //3. 唯一性(难度) 
        AdminModel.findOne({
            $and: [
                {username: fields.username},
                {_id: {$ne: id}}
            ]
        }, (err, result) => {
            //如果存在同名的情况, 该用户名不可用
            if(result){
                return res.render('notice/error', {msg: '用户名已经被占用~~', time: 2});
            }else{
                //用户名可用
                //4. 根据条件更新数据库的数据
                //准备数据
                let data = {};
                //如果用户填入新的密码, 则加密更新密码
                if(fields.password){
                    data = {
                        username: fields.username,
                        password: md5(fields.password)
                    }
                }else{
                    data = {
                        username: fields.username
                    }
                }
                //如果用户没有填入密码, 则不更新密码
                AdminModel.updateOne({_id: id}, data, (err, data) => {
                    if(err) {
                        return res.render('notice/error', {msg: '数据库更新失败~~', time: 2});
                    }
                    //成功
                    res.render('notice/success', {msg: '更新成功', url: '/admin', time: 3});
                });
            }
            
        })

        
    })
    
});

//查询
router.get('/admin',checkLogin,(req, res) => {
    //读取所有的管理员
    AdminModel.find((err, data) => {
        if(err){
            return res.render('notice/error', {msg: '数据库查询失败~~', time: 3});
        }
        //如果读取成功
        //数据与模板结合, 响应 HTML 的页面
        res.render('admin/list', {data, req, title: '查看所有管理员'})
    })
    
});

//显示登录页面
router.get('/login',  (req, res) => {
    //响应登录表单
    res.render('admin/login');
});

//登录操作
router.post('/login', (req, res) => {
    //1. 提取表单中的数据
    let form = formidable({});
    //解析
    form.parse(req, (err, fields, files) => {
        if (err) {
            res.status(500);
            res.send('表单解析失败~~')
            return;
        }
        //读取数据库查询与 username 相同的文档
        //使用用户名查询数据库              123
        AdminModel.findOne({username: fields.username}, (err, data) => {
            if(err){
                return res.render('notice/error', {msg: '查询失败~~', time: 2});
            }
            //没有查询到结果的情况
            if(!data){
                return res.render('notice/error', {msg: '您输入的用户名不存在 !!', time: 2});
            }
            //查询到结果了 data  {username: 123, password: '12312312312312afefa'}
            if(md5(fields.password) !== data.password){
                //输入的密码是不正确的
                return res.render('notice/error', {msg: '您输入的密码不正确 !!', time: 2});
            }else{
                //说明输入的密码是正确的
                //写入 session 数据
                req.session.uid = data._id;
                req.session.username = data.username;
                req.session.is_super = data.is_super;
                return res.render('notice/success', {msg: '登录成功 !!', time: 2, url: '/book'});
            }
        });
    })
    //2. 检查账号和密码是否正确
});

//退出登录
router.post('/logout', (req, res) => {
    //退出登录操作
    req.session.destroy(() => {
        res.render('notice/success', {msg: '安全退出登录', url:'/login', time: 3})
    })
});

//暴露对象
module.exports = router;

